前言
昨天的return to plt是利用binary裡面已經使用過的函式去重新調用,進而開shell,但是如果binary都沒有用到呢? 今天就是要來探討要如何取得從頭到尾都沒有用到的函式
說明
如果能得知library被map到的base address,就可以計算libc function的address,就可以調用libc的function,假如有information leak的漏洞(例如format string),就可以透過leak memory的內容,拿到libc segment的address
- bypass aslr拿到libc的隨機base
- address會是隨機的base address加上一個固定的offset(libc offset),不同版本的libc offset不同
漏洞利用
我們如果拿到一個leak,那假如我們確定這個leak他是甚麼function (可用gdb attach 去查看)
- 例如,我們leak出來的是printf@got的內容為0x7fd0f9e57e80,而binary的版本為2.27,我們就可以透過靜態分析(readelf -s...),得知function在library中的offset為0x684fe,扣掉offset就可以知道libc的base address ==> 0x7fd0f9e57e80 - 0x684fe
- 拿到base之後我就可以加上offset的方式得知其他function的address去call它,最後串成ROP
- system() = libc_base + system_offset